#include <my_header.h>
// 只能接受发送一次数据
/* Usage: ./1_server_UDP */
int main(void){                                  

    char *ip = "192.168.114.128";
    char *port = "8080";

    int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
    ERROR_CHECK(socket_fd, -1, "socket");

    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(atoi(port));
    server_addr.sin_addr.s_addr = inet_addr(ip);

    int res_bind = bind(socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
    ERROR_CHECK(res_bind, -1, "bind");

    // 接收客户端发送的数据
    struct sockaddr_in sockaddr_recv;
    char buf[60] = {0};
    socklen_t ser_len = sizeof(server_addr);
    int res_recvfrom = recvfrom(socket_fd, buf, sizeof(buf), 0, (struct sockaddr *)&sockaddr_recv, &ser_len);
    ERROR_CHECK(res_recvfrom, -1, "recvfrom");
    printf("client message:%s\n", buf);

    // 给客户端发送数据
    int res_sendto = sendto(socket_fd, "server", 6, 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
    ERROR_CHECK(res_sendto, -1, "sendto");

    close(socket_fd);
    return 0;
}

#if 0
>- 和基于`TCP`的`send和recv函数`不同的是, 基于`UDP`的`sendto和recvfrom函数`携带了地址信息, 用于确定目的地址和获取接收的信息的来源地址。
>- 这也就意味着,  在使用UDP进行无连接的通信时,  因为没有建立连接的过程，所以必须总是由客户端先调用sendto发送消息给服务端，这样服务端才能知道对端的地址信息，从进入后续的通信。
>- 在使用UDP进行无连接的通信时,  因为是无连接的,  所以客户端或服务端关闭, 对方无法直接感知。
>- 需要注意的是类型和参数:  socklen_t  *addrlen  (非int) (socklen_t  本身是unsigned int)

#endif
